package top.mysql.SQL;

public class SELECTS {

/**
 *      多表查询分类
 *      连接查询
 *          内连接：相当于查询A、B交集部分数据
 *          外连接：
 *              左外连接：查询左表所有数据，以及两张表交集部分数据
 *              右外连接：查询右表所有数据，以及两张表交集部分数据
 *          自连接：当前表与自身的连接查询，自连接必须使用表别名
 *      子查询
 *
 *      一对多： 在任意一方加入外键，关联另外一方的主键
 *      多对多： 建立中间表，中间表包含两个外键，关联两张表的主键
 *      一对一： 用于表结构拆分，在其中任何一方设置外键，关联另一方的主键
 *
 *      -----------------------------内连接---------------------------------------
 *
 *      内连接的语法分为两种: 隐式内连接、显式内连接。
 *
 *       隐式内连接
 *       SELECT 字段列表 FROM 表1 , 表2 WHERE 条件 ... ;
 *
 *      显式内连接
 *      SELECT 字段列表 FROM 表1 [ INNER ] JOIN 表2 ON 连接条件 ... ;
 *
 *      注意：一旦为表起了别名，就不能再使用表名来指定对应的字段了，此时只能够使用别名来指定字段。
 *
 *      -----------------------------外连接---------------------------------------
 *
 *      外连接分为两种，分别是：左外连接 和 右外连接。
 *
 *      左外连接相当于查询表1(左表)的所有数据，当然也包含表1和表2交集部分的数据。
 *
 *      左外连接
 *      SELECT 字段列表 FROM 表1 LEFT [ OUTER ] JOIN 表2 ON 条件 ... ;
 *
 *      右外连接
 *      SELECT 字段列表 FROM 表1 RIGHT [ OUTER ] JOIN 表2 ON 条件 ... ;
 *
 *
 *      -----------------------------自连接---------------------------------------
 *
 *      自连接查询，顾名思义，就是自己连接自己，也就是把一张表连接查询多次。
 *      而对于自连接查询，可以是内连接查询，也可以是外连接查询。
 *
 *      SELECT 字段列表 FROM 表A 别名A JOIN 表A 别名B ON 条件 ... ;
 *
 *      注意:
 *      在自连接查询中，必须要为表起别名，要不然我们不清楚所指定的条件、返回的字段，到底是哪一张表的字段。
 *
 *      -----------------------------联合查询---------------------------------------
 *
 *      对于union查询，就是把多次查询的结果合并起来，形成一个新的查询结果集。
 *
 *      SELECT 字段列表 FROM 表A ...          --返回字段列数和字段类型要一致
 *      UNION [ ALL ]                       --ALL没有就去重
 *      SELECT 字段列表 FROM 表B ....;
 *
 *
 *      -----------------------------子查询---------------------------------------
 *
 *      SQL语句中嵌套SELECT语句，称为嵌套查询，又称子查询。
 *
 *      分类：
 *      标量子查询（子查询结果为单个值）
 *      列子查询(子查询结果为一列)
 *      行子查询(子查询结果为一行)
 *      表子查询(子查询结果为多行多列)
 *
 *      根据子查询位置，分为：
 *      WHERE之后
 *      FROM之后
 *      SELECT之后
 *
 *      子查询外部的语句可以是INSERT / UPDATE / DELETE / SELECT 的任何一个。
 *
 *      标量子查询
 *      子查询返回的结果是单个值（数字、字符串、日期等），最简单的形式，这种子查询称为标量子查询。
 *      常用的操作符：= <> > >= < <=
 *
 *      列子查询
 *      子查询返回的结果是一列（可以是多行），这种子查询称为列子查询。
 *
 *      常用的操作符：
 *      IN              在指定的集合范围之内，多选一
 *      NOT IN          不在指定的集合范围之内
 *      ANY             子查询返回列表中，有任意一个满足即可
 *      SOME            与ANY等同，使用SOME的地方都可以使用ANY
 *      ALL             子查询返回列表的所有值都必须满足
 *
 *      举例：
 *      select * from emp where salary > any (
 *          select e.salary from dept d inner join emp e
 *          where d.name = "财务部"and d.id = e.dept_id
 *      );
 *
 *      行子查询
 *      子查询返回的结果是一行（可以是多列），这种子查询称为行子查询。
 *      常用的操作符：= 、<> 、IN 、NOT IN
 *
 *      举例：
 *      select * from emp where (salary,managerid) = (
 *          select salary,managerid from emp where name = "张无忌"
 *      );
 *
 *      表子查询
 *      子查询返回的结果是多行多列，这种子查询称为表子查询。
 *      常用的操作符：IN
 *
 *      举例：
 *      select * from emp where (job,salary) in (
 *          select job,salary from emp where name = "宋远桥" or name = "鹿杖客"
 *      );
 *
 *      举例二：
 *      select * from (
 *              select * from emp where entrydate > "2006-01-01"
 *          ) e1 inner join dept d1 on e1.dept_id = d1.id;
 *
 *
 *      其他案例：
 *      select e2.* from emp e2 where e2.salary < (
 *         select avg(e1.salary) from emp e1 where e1.dept_id = e2.dept_id
 *      );
 *
 *      select id,name,(select count(*) from emp where dept_id = d.id) from dept d;
 */

}
